Memory accesses are a vital part of program execution in a computer system. Generally, one or more processors (such as central processing units (CPUs), graphics processing units (GPUs), Digital Signal Processors (DSPs), Hardware Accelerators (HACs), or other processors) access various memory banks via a memory controller. Recent years have seen the rise of multi-core processors, where a memory controller controls access to the memory banks from multiple different processors or cores (also called master processors). As processor speed and number of processors increase, however, there has not been a proportional increase in the access speed to memory. Specifically, when multiple processors attempt to access the same memory bank at or near the same time, one of the processors waits while the request from the other processor is serviced. As the number of processors increases, the number of accesses and potentially conflicting accesses also increases, keeping memory access time degraded.